#!/bin/bash

# Prisma 初始化脚本
# 用于完整初始化 Prisma 环境，包括迁移和客户端生成

# 设置错误处理
set -e

# 输出带颜色的消息
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 恢复默认颜色

info() { echo -e "${GREEN}✓ $1${NC}"; }
warn() { echo -e "${YELLOW}⚠️  $1${NC}"; }
error() { echo -e "${RED}❌ $1${NC}"; exit 1; }

# 显示标题
echo "🚀 Prisma 环境初始化工具"
echo "========================="

# 检查必要文件
if [ ! -f "package.json" ]; then
  error "请在项目根目录运行此脚本"
fi

if [ ! -f "prisma/schema.prisma" ]; then
  error "未找到 schema.prisma 文件"
fi

# 检查环境变量
if [ ! -f ".env" ]; then
  if [ -f ".env.example" ]; then
    warn "未找到 .env 文件，将从 .env.example 创建"
    cp .env.example .env
    info "已创建 .env 文件"
  else
    error "未找到 .env 或 .env.example 文件"
  fi
fi

# 检查数据库连接
source .env
if [ -z "$DATABASE_URL" ]; then
  error "未设置 DATABASE_URL 环境变量"
fi

echo "📡 检查数据库连接..."
if ! npx prisma db push --skip-generate --preview-feature &>/dev/null; then
  error "无法连接到数据库，请检查数据库配置"
fi
info "数据库连接正常"

# 安装依赖
echo -e "\n📦 安装依赖..."
npm install prisma @prisma/client --save-dev || error "依赖安装失败"
info "依赖安装完成"

# 创建目录结构
echo -e "\n📁 创建目录结构..."
mkdir -p prisma/migrations
mkdir -p src/types
mkdir -p src/lib
info "目录结构创建完成"

# 生成初始迁移
echo -e "\n🔄 生成初始迁移..."
npx prisma migrate dev --name init --create-only || error "迁移创建失败"
info "初始迁移已创建"

# 确认执行迁移
echo -e "\n⚠️  警告: 即将执行数据库迁移"
echo "这将修改数据库结构，建议先备份数据库"
read -p "是否继续? (yes/no): " answer

if [ "$answer" != "yes" ]; then
  warn "操作已取消"
  exit 0
fi

# 执行迁移
echo -e "\n🛠️  执行数据库迁移..."
npx prisma migrate deploy || error "迁移执行失败"
info "数据库迁移完成"

# 生成客户端
echo -e "\n⚙️  生成 Prisma 客户端..."
npx prisma generate || error "客户端生成失败"
info "Prisma 客户端已生成"

# 创建 Prisma 类型声明
echo -e "\n📝 生成类型声明文件..."
cat > src/types/prisma.d.ts << EOF
/**
 * Prisma 类型声明文件
 * 由 init-prisma.sh 自动生成
 */

declare namespace NodeJS {
  interface Global {
    prisma: import('@prisma/client').PrismaClient;
  }
}

declare module '@prisma/client';
EOF
info "类型声明文件已生成"

# 创建 Prisma 辅助函数
echo -e "\n🛠️  生成辅助函数..."
cat > src/lib/prisma-helpers.ts << EOF
/**
 * Prisma 辅助函数
 * 由 init-prisma.sh 自动生成
 */

import { PrismaClient } from '@prisma/client'

/**
 * 创建带有事务的 Prisma 客户端
 */
export function createTransactionClient() {
  return new PrismaClient().$transaction.bind(new PrismaClient())
}

/**
 * 事务包装器
 */
export async function withTransaction<T>(
  fn: (tx: PrismaClient) => Promise<T>
): Promise<T> {
  const prisma = new PrismaClient()
  try {
    const result = await prisma.$transaction(fn)
    await prisma.$disconnect()
    return result
  } catch (e) {
    await prisma.$disconnect()
    throw e
  }
}
EOF
info "辅助函数已生成"

# 创建 VS Code 设置
echo -e "\n⚙️  配置 VS Code 设置..."
mkdir -p .vscode
cat > .vscode/settings.json << EOF
{
  "prisma.format.enabled": true,
  "[prisma]": {
    "editor.defaultFormatter": "Prisma.prisma",
    "editor.formatOnSave": true
  }
}
EOF
info "VS Code 设置已配置"

# 显示完成信息
echo -e "\n✨ Prisma 环境初始化完成!"
echo -e "\n📝 生成的文件:"
echo "• 数据库迁移:  prisma/migrations/"
echo "• 类型声明:    src/types/prisma.d.ts"
echo "• 辅助函数:    src/lib/prisma-helpers.ts"
echo "• VS Code配置: .vscode/settings.json"

echo -e "\n💡 后续步骤:"
echo "1. 检查 .env 中的数据库配置"
echo "2. 查看 prisma/schema.prisma 确认模型定义"
echo "3. 使用 npm run dev 启动开发服务器"
echo "4. 访问 http://localhost:5555 启动 Prisma Studio"

echo -e "\n🔧 常用命令:"
echo "• npx prisma studio     - 启动 Prisma Studio"
echo "• npx prisma generate   - 更新客户端"
echo "• npx prisma migrate dev - 创建新迁移"
echo "• npx prisma db push    - 直接推送更改"

echo -e "\n📚 文档链接:"
echo "• Prisma 文档: https://www.prisma.io/docs/"
echo "• Schema 参考: https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference"
echo "• 客户端 API: https://www.prisma.io/docs/reference/api-reference/prisma-client-reference"

# 提示运行 Prisma Studio
echo -e "\n❓ 是否要启动 Prisma Studio? (y/n)"
read -r answer

if [[ "$answer" =~ ^[Yy]$ ]]; then
  npx prisma studio
fi
